home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / web / noweb / src / c / modtrees.c < prev    next >
C/C++ Source or Header  |  1995-02-24  |  2KB  |  74 lines

  1. #line 14 "modtrees.nw"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "strsave.h"
  6. #include "modules.h"
  7. #include "modtrees.h"
  8. #include "errors.h"
  9.  
  10. typedef struct tnode {          /* tree node */
  11.   struct tnode *left, *right;
  12.   Module data;
  13. } TNODE;
  14.  
  15. static struct tnode *root=NULL;
  16.         
  17. #line 58 "modtrees.nw"
  18. static Module insert_tree(TNODE **rootptr, char *modname);
  19. static Module lookup_tree(TNODE **rootptr, char *modname);
  20. #line 31 "modtrees.nw"
  21. Module insert (char *modname) {
  22.     return insert_tree (&root, modname);
  23. }
  24.  
  25. static Module
  26. insert_tree(TNODE **rootptr, char *modname) {
  27.      if (*rootptr==NULL) {
  28.          
  29. #line 54 "modtrees.nw"
  30.        checkptr(*rootptr=(struct tnode *) malloc (sizeof(struct tnode)));
  31.        (*rootptr)->left = (*rootptr)->right = NULL;
  32. #line 39 "modtrees.nw"
  33.          return (*rootptr)->data = newmodule(modname);
  34.      } 
  35.      if (strcmp((*rootptr)->data->name,modname)==0) {
  36.          return (*rootptr)->data;
  37.      } else if (strcmp((*rootptr)->data->name,modname)<0) {
  38.          return insert_tree(&((*rootptr)->left),modname);
  39.      } else /* >0 */ {
  40.          return insert_tree(&((*rootptr)->right),modname);
  41.      }
  42.  
  43. }
  44. #line 62 "modtrees.nw"
  45. Module lookup (char *modname) {
  46.     return lookup_tree (&root, modname);
  47. }
  48.  
  49. static Module
  50. lookup_tree(TNODE **rootptr, char *modname) {
  51.      if (*rootptr==NULL) {
  52.         return NULL;
  53.      } 
  54.      if (strcmp((*rootptr)->data->name,modname)==0) {
  55.          return (*rootptr)->data;
  56.      } else if (strcmp((*rootptr)->data->name,modname)<0) {
  57.          return lookup_tree(&((*rootptr)->left),modname);
  58.      } else /* >0 */ {
  59.          return lookup_tree(&((*rootptr)->right),modname);
  60.      }
  61. }
  62. #line 86 "modtrees.nw"
  63. static
  64. void apply_to_tree(TNODE *p, void (*fun)(Module)) {
  65.     if (p != NULL) {
  66.         apply_to_tree(p->left,fun);
  67.         (*fun)(p->data);
  68.         apply_to_tree(p->right,fun);
  69.     }
  70. }
  71. void apply_each_module(void (*fun)(Module)) {
  72.     apply_to_tree(root,fun);
  73. }
  74.